home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 141 / Gekkan Dennou Club - 2000.2 Vol. 141 (Japan) (Track 1).bin / docs / asm / rasup.s < prev    next >
Encoding:
Text File  |  2000-01-10  |  2.4 KB  |  97 lines

  1. ;----------------------------------------------------------------
  2. ;低速スムーススクロールアップ
  3. ;    テキストの上から32行を4ドットずつスムーススクロールアップします
  4. ;    ESCで終了します
  5.  
  6.     .include    doscall.mac
  7.     .include    iocscall.mac
  8.  
  9. ;----------------------------------------------------------------
  10. ;ラスタコピーマクロ
  11. ;<an.l:$00E88001に固定してあるアドレスレジスタ
  12. ;<dn.w:ソースラスタブロック番号*$0100+デスティネーションラスタブロック番号が
  13. ;    入っているレジスタ
  14. ;<sn.w:srを保存してあるレジスタ
  15. RASCPY    .macro    an,dn,sn
  16. @_1:    tst.b    (a0)            ;水平帰線期間を待つ
  17.     bmi    @_1
  18.     ori.w    #$0700,sr        ;割り込み禁止
  19. @_2:    tst.b    (a0)            ;水平表示期間を待つ
  20.     bpl    @_2
  21.     move.w    dn,($00E8002C-$00E88001,an)    ;ラスタブロック番号を設定
  22.     move.w    #8,($00E80480-$00E88001,an)    ;ラスタコピー実行
  23.     move.w    sn,sr            ;割り込み許可
  24.     .endm
  25.  
  26. ;----------------------------------------------------------------
  27. ;ラスタコピー終了マクロ
  28. ;<an.l:$00E88001に固定してあるアドレスレジスタ
  29. RASEND    .macro    an
  30. @_1:    tst.b    (a0)            ;水平帰線期間を待つ
  31.     bmi    @_1
  32. @_2:    tst.b    (a0)            ;水平表示期間を待つ
  33.     bpl    @_2
  34.     move.w    #$0000,($00E80480-$00E88001,a0)    ;ラスタコピー終了(clrは避ける)
  35.     .endm
  36.  
  37. ;----------------------------------------------------------------
  38. ;次の垂直帰線期間を待つマクロ
  39. ;<an.l:$00E88001に固定してあるアドレスレジスタ
  40. VSYNC    .macro    an
  41. @_1:    btst.b    #4,(a0)            ;垂直表示期間を待つ
  42.     beq    @_1
  43. @_2:    btst.b    #4,(a0)            ;垂直帰線期間を待つ
  44.     bne    @_2
  45.     .endm
  46.  
  47. ;----------------------------------------------------------------
  48. ;----------------------------------------------------------------
  49. ;メインルーチン
  50.  
  51. ;スーパーバイザモードへ移行
  52.     clr.l    -(sp)
  53.     DOS    _SUPER
  54.     move.l    d0,(sp)
  55.  
  56. ;カーソル消去
  57.     IOCS    _B_CUROFF
  58.  
  59.     move.w    $00E8002A,-(sp)
  60.  
  61. ;1ラスタブロックずつスクロールアップ
  62.     lea.l    $00E88001,a0        ;$00E88001に固定
  63.     move.w    #$0101,d2        ;ラスタブロック番号の増分
  64.     move.w    #%0011,($00E8002A-$00E88001,a0)    ;ラスタコピープレーンセレクト
  65.     move.w    sr,d3            ;srを保存
  66. loop:
  67.     VSYNC    a0            ;次の垂直帰線期間を待つ
  68.     move.w    #$0080,d0        ;ラスタブロック0→128
  69.     RASCPY    a0,d0,d3
  70.     move.w    #$0100,d0        ;ラスタブロック1→0,…,128→127
  71.     moveq.l    #128-1,d1
  72. 1:    RASCPY    a0,d0,d3
  73.     add.w    d2,d0
  74.     dbra    d1,1b
  75.     RASEND    a0
  76.     btst.b    #1,$0800.w        ;ESCキーチェック
  77.     beq    loop
  78.  
  79.     move.w    (sp)+,$00E8002A
  80.  
  81. ;キーバッファフラッシュ
  82.     bra    2f
  83. 1:    IOCS    _B_KEYINP
  84. 2:    IOCS    _B_KEYSNS
  85.     tst.l    d0
  86.     bne    1b
  87.  
  88. ;カーソル表示
  89.     IOCS    _B_CURON
  90.  
  91. ;ユーザモードに復帰
  92.     DOS    _SUPER
  93.     addq.l    #4,sp
  94.  
  95. ;終了
  96.     DOS    _EXIT
  97.